﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ENProyectoSIETE;
using CADProyectoSIETE.Properties;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using CADProyectoSIETE.BDProyecto7DataSetTableAdapters;
using System.Collections;

namespace CADProyectoSIETE
{
    public class LocalizacionCAD
    {
        private string conexion;

        public string insertarLocalizacion(ENLocalizacion localizacion)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);
            
            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from localizacion ", conex);

                da.Fill(bdvirtual, "localizacion");
                //Obtenemos la tabla localizacion
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["localizacion"];
                //Creamos la nueva fila a insertar
                DataRow nuevafila = tabla.NewRow();
                //nuevafila[0] = localizacion.IdLocalizacion;
                nuevafila[1] = localizacion.NombreLocalizacion;
                nuevafila[2] = localizacion.DescripcionLocalizacion;
                nuevafila[3] = localizacion.ImagenLocalizacion;
                nuevafila[4] = localizacion.FondoLocalizacion;

                tabla.Rows.Add(nuevafila);

                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bdvirtual, "localizacion");

                //Insertamos en EnemigoLocalizacion, obtenemos el indice de la localizacion que acabamos de insertar
                DataSet bdvirtualIndice = new DataSet();
                SqlDataAdapter daindicelocalizacion = new SqlDataAdapter("select * from localizacion order by idLocalizacion desc",conex);

                daindicelocalizacion.Fill(bdvirtualIndice,"localizacion");
                DataTable tablaindices = new DataTable();
                tablaindices = bdvirtualIndice.Tables["localizacion"];

                /*---------*/
                DataSet bdvirtualenemigo = new DataSet();
                SqlDataAdapter daenemigo = new SqlDataAdapter("select * from enemigolocalizacion", conex);

                daenemigo.Fill(bdvirtualenemigo, "enemigolocalizacion");
                DataTable tablaenemigo = new DataTable();
                tablaenemigo = bdvirtualenemigo.Tables["enemigolocalizacion"];

                
                //en tablaindices de [0][0] tenemos el indice de mayor valor (el ultimo insertado) en localizacion
                foreach(ENEnemigosLocalizacion enemigolocalizacion in localizacion.EnemigosLocalizacion){
                    DataRow nuevafilaenemigo = tablaenemigo.NewRow();
                    nuevafilaenemigo[0] = tablaindices.Rows[0][0].ToString();
                    nuevafilaenemigo[1] = enemigolocalizacion.IDEnemigo;
                    nuevafilaenemigo[2] = enemigolocalizacion.Porcentaje;

                    tablaenemigo.Rows.Add(nuevafilaenemigo);
                }
                

                SqlCommandBuilder cbuilderenemigos = new SqlCommandBuilder(daenemigo);
                daenemigo.Update(bdvirtualenemigo, "enemigolocalizacion");
                /*-----------*/

                //Insertamos en ObjetoLocalizacion
                DataSet bdvirtualobjeto = new DataSet();
                SqlDataAdapter daobjeto = new SqlDataAdapter("select * from objetolocalizacion",conex);

                daobjeto.Fill(bdvirtualobjeto, "objetolocalizacion");
                DataTable tablaobjeto = new DataTable();
                tablaobjeto = bdvirtualobjeto.Tables["objetolocalizacion"];

                foreach(ENObjetoLocalizacion objetolocalizacion in localizacion.ObjetosLocalizacion ){
                    DataRow nuevafilaobjeto = tablaobjeto.NewRow();

                    nuevafilaobjeto[0] = tablaindices.Rows[0][0];
                    nuevafilaobjeto[1] = objetolocalizacion.IDObjeto;
                    nuevafilaobjeto[2] = objetolocalizacion.Porcentaje;

                    tablaobjeto.Rows.Add(nuevafilaobjeto);
                }

                SqlCommandBuilder cbuilderobjetos = new SqlCommandBuilder(daobjeto);
                daobjeto.Update(bdvirtualobjeto, "objetolocalizacion");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            conex.Close();
            return "OK";
        }

        public string borrarLocalizacion(ENLocalizacion localizacion)
        {
            int i = 0;
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from localizacion ", conex);

                da.Fill(bdvirtual, "localizacion");
                //Obtenemos la tabla localizacion
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["localizacion"];

                foreach (DataRow registro in tabla.Rows)
                {
                    if ((int)registro["idLocalizacion"] == localizacion.IdLocalizacion)
                    {
                        tabla.Rows[i].Delete();
                    }
                    i++;
                }

                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bdvirtual, "localizacion");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            conex.Close();
            return "OK";
        }

        public DataSet obtenerLocalizaciones()
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from localizacion", conex);

                da.Fill(bdvirtual, "localizacion");
                return bdvirtual;
            }
            catch (Exception ex)
            {
                DataSet bdvacia = new DataSet();
                throw ex;
            }
        }

        public DataTable obtenerLocalizacionNombre(string nombre, string nom_des)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = null;
                if (nom_des == "nombre")
                {
                    da = new SqlDataAdapter("select * from localizacion where nombreLocalizacion LIKE '%" + nombre + "%'", conex);
                }
                else if (nom_des == "descripcion")
                {
                    da = new SqlDataAdapter("select * from localizacion where descripcionLocalizacion LIKE '%" + nombre + "%'", conex);
                }
                da.Fill(bdvirtual, "localizacion");
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["localizacion"];

                return tabla;
            }
            catch
            {
                DataTable tablavacia = new DataTable();
                return tablavacia;
            }
            finally
            {
                conex.Close();
            }
        }

        public void borrarLocalizacion(int id)
        {
            try
            {
                LocalizacionTableAdapter locTableAdapter = new LocalizacionTableAdapter();
                locTableAdapter.Delete(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public ENLocalizacion obtenerLocalizacion(int index)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from localizacion where idLocalizacion=" + index.ToString(), conex);

                da.Fill(bdvirtual, "localizacion");
                ENLocalizacion enlocalizacion = new ENLocalizacion();

                foreach (DataRow registro in bdvirtual.Tables["localizacion"].Rows)
                {
                    enlocalizacion.IdLocalizacion = int.Parse(registro[0].ToString());
                    enlocalizacion.NombreLocalizacion = registro[1].ToString();
                    enlocalizacion.DescripcionLocalizacion = registro[2].ToString();
                    enlocalizacion.ImagenLocalizacion = registro[3].ToString();
                    enlocalizacion.FondoLocalizacion = registro[4].ToString();
                }

                return enlocalizacion;
            }
            catch
            {
                ENLocalizacion localizacionerror = new ENLocalizacion();
                return localizacionerror;
            }
            finally
            {
                conex.Close();
            }

        }

        public string editarLocalizacion(ENLocalizacion localizacion)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                int i = 0;

                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from localizacion", conex);

                da.Fill(bdvirtual, "localizacion");

                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["localizacion"];

                foreach(DataRow registro in tabla.Rows)
                {
                    if((int)registro["idLocalizacion"] == localizacion.IdLocalizacion)
                    {
                        tabla.Rows[i][0] = localizacion.IdLocalizacion;
                        tabla.Rows[i][1] = localizacion.NombreLocalizacion;
                        tabla.Rows[i][2] = localizacion.DescripcionLocalizacion;
                        tabla.Rows[i][3] = localizacion.ImagenLocalizacion;
                        tabla.Rows[i][4] = localizacion.FondoLocalizacion;
                    }

                    i++;
                }

                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bdvirtual, "localizacion");

                /*---------Insertamos los enemigos asociados----------------*/
                DataSet bdvirtualenemigo = new DataSet();
                SqlDataAdapter daenemigo = new SqlDataAdapter("select * from enemigolocalizacion", conex);

                daenemigo.Fill(bdvirtualenemigo, "enemigolocalizacion");
                DataTable tablaenemigo = new DataTable();
                tablaenemigo = bdvirtualenemigo.Tables["enemigolocalizacion"];

                //Primero borramos los enemigos asociados
                i = 0;
                foreach(DataRow registro in tablaenemigo.Rows)
                {
                    if ((int)registro["idLocalizacion"] == localizacion.IdLocalizacion)
                    {
                        tablaenemigo.Rows[i].Delete();
                    }

                    i++;
                }
                SqlCommandBuilder cbuilderenemigos = new SqlCommandBuilder(daenemigo);
                daenemigo.Update(bdvirtualenemigo, "enemigolocalizacion");

                //Insertamos los enemigos en el EN (estan incluidos los que habia antes)
                DataSet bdvirtualenemigoinsertar = new DataSet();
                SqlDataAdapter daenemigoinsertar = new SqlDataAdapter("select * from enemigolocalizacion", conex);

                daenemigoinsertar.Fill(bdvirtualenemigoinsertar, "enemigolocalizacion");
                DataTable tablaenemigoinsertar = new DataTable();
                tablaenemigoinsertar = bdvirtualenemigoinsertar.Tables["enemigolocalizacion"];
                foreach (ENEnemigosLocalizacion enemigolocalizacion in localizacion.EnemigosLocalizacion)
                {
                    DataRow nuevafilaenemigo = tablaenemigoinsertar.NewRow();
                    nuevafilaenemigo[0] = localizacion.IdLocalizacion;
                    nuevafilaenemigo[1] = enemigolocalizacion.IDEnemigo;
                    nuevafilaenemigo[2] = enemigolocalizacion.Porcentaje;

                    tablaenemigoinsertar.Rows.Add(nuevafilaenemigo);
                }

                SqlCommandBuilder cbuilderenemigosinsertar = new SqlCommandBuilder(daenemigoinsertar);
                daenemigoinsertar.Update(bdvirtualenemigoinsertar, "enemigolocalizacion");
                /*-----------*/

                //Insertamos en ObjetoLocalizacion
                DataSet bdvirtualobjeto = new DataSet();
                SqlDataAdapter daobjeto = new SqlDataAdapter("select * from objetolocalizacion", conex);

                daobjeto.Fill(bdvirtualobjeto, "objetolocalizacion");
                DataTable tablaobjeto = new DataTable();
                tablaobjeto = bdvirtualobjeto.Tables["objetolocalizacion"];

                //Primero borramos los objetos asociados
                i = 0;
                foreach (DataRow registro in tablaobjeto.Rows)
                {
                    if ((int)registro["idLocalizacion"] == localizacion.IdLocalizacion)
                    {
                        tablaobjeto.Rows[i].Delete();
                    }

                    i++;
                }
                SqlCommandBuilder cbuilderobjetos = new SqlCommandBuilder(daobjeto);
                daobjeto.Update(bdvirtualobjeto, "objetolocalizacion");

                //Insertamos los objetos en el EN (estan incluidos los que habia antes)
                DataSet bdvirtualobjetoinsertar = new DataSet();
                SqlDataAdapter daobjetoinsertar = new SqlDataAdapter("select * from objetolocalizacion", conex);

                daobjetoinsertar.Fill(bdvirtualobjetoinsertar, "objetolocalizacion");
                DataTable tablaobjetoinsertar = new DataTable();
                tablaobjetoinsertar = bdvirtualobjetoinsertar.Tables["objetolocalizacion"];

                foreach (ENObjetoLocalizacion objetolocalizacion in localizacion.ObjetosLocalizacion)
                {
                    DataRow nuevafilaobjeto = tablaobjetoinsertar.NewRow();

                    nuevafilaobjeto[0] = localizacion.IdLocalizacion;
                    nuevafilaobjeto[1] = objetolocalizacion.IDObjeto;
                    nuevafilaobjeto[2] = objetolocalizacion.Porcentaje;

                    tablaobjetoinsertar.Rows.Add(nuevafilaobjeto);
                }

                SqlCommandBuilder cbuilderobjetosinsertar = new SqlCommandBuilder(daobjetoinsertar);
                daobjetoinsertar.Update(bdvirtualobjetoinsertar, "objetolocalizacion");
            }
            catch(Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            return "OK";
        }

        //Obtener todas las localizaciones asociadas al mapa que se pasa por argumento
        public ArrayList obtenerLocalizacionMapa(int idMapa)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select idLocalizacion, coordenadaX, coordenadaY from MapaLocalizacion where idMapa="+idMapa.ToString(), conex);

                da.Fill(bdvirtual, "MapaLocalizacion");

                ArrayList localizaciones = new ArrayList();
                
                
                foreach(DataRow registro in bdvirtual.Tables["MapaLocalizacion"].Rows)
                {
                    ENMapaLocalizacion localizacion = new ENMapaLocalizacion();

                    localizacion.IDLocalizacion = int.Parse(registro[0].ToString());
                    localizacion.CordX = int.Parse(registro[1].ToString());
                    localizacion.CordY = int.Parse(registro[2].ToString());
                    localizacion.Nombre = "";

                    localizaciones.Add(localizacion);
                }

                

                foreach (ENMapaLocalizacion item in localizaciones)
                {
                    SqlDataAdapter danombre = new SqlDataAdapter("select nombreLocalizacion from localizacion where idLocalizacion="+item.IDLocalizacion, conex);
                    DataSet bdvirtualnombre = new DataSet();
                    danombre.Fill(bdvirtualnombre, "localizacion");

                    item.Nombre = bdvirtualnombre.Tables["localizacion"].Rows[0][0].ToString();
                }

                return localizaciones;
            }
            catch
            {
                ArrayList localizacioneserror = new ArrayList();
                return localizacioneserror;
            }
            finally
            {
                conex.Close();
            }

        }

        //Obtener todos los registros de la tabla MapaLocalizacion
        public DataSet obtenerLocalizacionesMapa()
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from MapaLocalizacion", conex);

                da.Fill(bdvirtual, "MapaLocalizacion");
                return bdvirtual;
            }
            catch
            {
                DataSet bdvacia = new DataSet();
                return bdvacia;
            }
            finally
            {
                conex.Close();
            }
        }

    }
}
